package main

import (
	. "go_data_structures_and_algorithms/system_class/section11/pojo"
)

/*
1. 定义了一个BinaryTree结构体，表示二叉树的节点。每个节点有一个值，一个左子节点和一个右子节点。
2. 定义了一个NewBinaryTree函数，用于创建一个新的BinaryTree并赋予一个值。
3. 定义了一个PrintTree函数，用于打印出二叉树。这个函数接受一个二叉树的根节点作为参数。
4. 在PrintTree函数中，首先判断根节点是否为空，如果为空则直接返回，不打印任何内容。
5. 然后，调用getHeight函数，获取二叉树的高度。这个函数使用递归的方式，从根节点开始
，分别计算左子树和右子树的高度，并返回较大的那个加一作为整棵树的高度。
6. 接着，计算二叉树最后一层的宽度。这个宽度等于2的高度次方，因为最后一层最多有2的高度次方个节点。
7. 然后，创建一个二维切片（slice）来存储二叉树的值。这个切片的行数等于二叉树的高度，列数等于最后一层的宽度。初始时，每个元素都是空格字符串。
8. 接着，调用fillMatrix函数，用深度优先搜索（DFS）的方式，将二叉树的值填充到切片中。这个函数接受四个参数：
当前节点，切片，当前层次和当前区间。当前区间表示当前节点在切片中所占的列范围。
9. 在fillMatrix函数中，首先判断当前节点是否为空或者当前层次是否超过了切片的行数，如果是则直接返回。
10. 然后，计算当前节点在切片中的列位置。这个位置等于当前区间的中点。
11. 然后，在切片中将当前节点的值填充到对应的位置上。
12. 然后，递归地调用fillMatrix函数，分别处理当前节点的左子节点和右子节点。左子节点的区间是当前区间的左半部分，
右子节点的区间是当前区间的右半部分。层次都加一。
13. 最后，在PrintTree函数中，遍历切片的每一行，并将每一行拼接成一个字符串打印出来。

这就是这段代码的思路。希望对你有帮助。*/
//BinaryTreerepresents a node of a binary tree

// NewBinaryTree creates a newBinaryTreewith the given value

// PrintTree prints the binary tree in a human-readable way

func main() {
	// create a sample binary tree
	root := NewBinaryTree(1)
	root.Left = NewBinaryTree(2)
	root.Right = NewBinaryTree(3)
	root.Left.Left = NewBinaryTree(4)
	root.Left.Right = NewBinaryTree(5)
	root.Right.Left = NewBinaryTree(6)
	root.Right.Right = NewBinaryTree(7)
	root.Right.Right.Right = NewBinaryTree(8)
	root.Right.Right.Right.Right = NewBinaryTree(9)
	// print the tree
	PrintTree(root)
}
